package exercise;

import java.util.Scanner;

public class EX05_OOP4 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 예제1
		RetangleVO rv = new RetangleVO(4, 40, "RED");
		/*
		 * RetangleService rs = new RetangleService(); rv.getArea =
		 * rs.getArea1(rv.width, rv.height); rv.getPerimeter =
		 * rs.getPerimeter1(rv.width, rv.height);
		 */
		rv.getArea = RetangleService.getArea1(rv.width, rv.height);
		rv.getPerimeter = RetangleService.getPerimeter1(rv.width, rv.height);
		System.out.println(rv.getArea);
		System.out.println(rv.getPerimeter);

		// 예제2
		FanVO f = new FanVO(FanVO.FAST, "YELLOW", 10, false);
		// FanVO fv = new FanVO(10, "YELLOW", new FanVO().FAST, true);
		// System.out.println(
		// FanVO.showFanInfo(f.speed,f.color,f.radius,f.on ));
		System.out.println(FanService.showFanInfo(f));

		/*
		 * System.out.println("선풍기 팬의 크기 : " + fv.radius);
		 * System.out.println("선풍기의 색상 : " + fv.color); if (fv.on) {
		 * System.out.println("선풍기 회전 속도 : " + fv.speed); }
		 * System.out.println("작동여부 : " + FanService.showFanInfo(fv.on));
		 */

		// 예제3
		AccountVO av = new AccountVO(1122, 20000, 4.5F, "2013-07-11");
		System.out.println("계좌번호 : " + av.aid);
		System.out.println("통장잔액 : " + av.balance);
		System.out.println("연간이자율 : " + av.interestRate);
		float result = AccountService.getmonthlyinterestRate(av.interestRate);
		System.out.println("월간 이자율 : " + result);
		int result1 = AccountService.withDraw(av.balance, av.a);
		System.out.println("예금후 남은금액 : " + result1);
		result1 = AccountService.withDraw(av.balance, av.a);
		System.out.println("예금후 남은금액 : " + result1);
		// call by value(값에 의한 전달)
		// 메서드의 매개변수 유형이 기본 자료형인 경우
		// 기본자료형 값을 메서드의 매개변수로 전달하면 jvm은 메서드의 지역변수에 그값을 복사해줌
		// 따라서, 메서드의 지역변수 값을 변경하더라도, 전달해준 변수에는 영향을 미치지는 않음
		int i = 1;
		while (i < 5) {
			AccountService.deposit(av, 3000);
			System.out.println(av.balance);
			++i;
		}

		// call by reference(주소에 의한 전달)
		// 메서드의 매개변수 유형이 참조 자료형인 경우
		// 만일 참조형 변수를 메서드의 매개변수로 전달하면 지역변수는 참조형 변수가 전달해 준 객체를
		// 가리키게 됨 즉, 참조형 변수에 저장된 값은 실제 값이 아니고 그 값을 가리키는 주소를 의미하기때문임
		// 따라서, 메서드에서 참조된 객체에 변경을 가하면 그 변화는 호출된 코드에도 반영됨

	}// main

} // class

// 예제 1
class RetangleVO {
	float width;
	float height;
	String color;
	float getArea;
	float getPerimeter;

	public RetangleVO() {
		width = 1.0F;
		height = 1.0F;
		color = "white";
		getArea = 0;
		getPerimeter = 0;
	}

	public RetangleVO(float width, float height, String color) {
		this.width = width;
		this.height = height;
		this.color = color;
	}
}

class RetangleService {
	static float getArea1(float width, float height) {
		return width * height;
	}

	static float getPerimeter1(float width, float height) {
		return 2 * width + 2* height;
	}
}

// 예제2
class FanVO {
	// 속도를 나타내는 상수들은 객체생성없이 바로 사용가능해야 함
	// static final 예약어를 사용함
	// 한편, jdk5이상에서는 이것을 대체하기 위해 Enum 이라는 새로운 클래스 자료형이 추가됨
	static final int SLOW = 1;
	static final int MEDIUM = 2;
	static final int FAST = 3;
	int speed;
	boolean on;
	float radius;
	String color;

	public FanVO() {
		speed = this.SLOW;
		on = false;
		radius = 5.0f;
		color = "blue";
	}

	public FanVO(float radius, String color, int speed, boolean on) {
		this.color = color;
		this.on = on;
		this.radius = radius;
		this.speed = speed;
	}

}

class FanService {
	// 메서드 다중정의 overloading
	// 메서드 서명만 다르면 메서드 이름은 동일하게 작성가능
	static String showFanInfo(int speed, String color, float radius, boolean on) {
		String msg = "";
		if (on == true)
			msg = speed + "," + color + "," + radius + "," + "작동중";
		// System.out.println(speed + "," + color + "," + radius + "," + "작동중");
		else
			msg = color + "," + radius + "," + "꺼져있음";
		// System.out.println(color + "," + radius + "," + "꺼져있음");
		return msg;
	}

	static String showFanInfo(FanVO f) {
		String msg = "";
		if (f.on == true)
			msg = f.speed + "," + f.color + "," + f.radius + "," + "작동중";
		// System.out.println(speed + "," + color + "," + radius + "," + "작동중");
		else
			msg = f.color + "," + f.radius + "," + "꺼져있음";
		// System.out.println(color + "," + radius + "," + "꺼져있음");
		return msg;
	}
}

/*
 * static void showFanInfo(FanVO f) { String msg = ""; if (f.on) msg = f.speed +
 * "," + f.color + "," + f.radius + "," + "켜져있음"; else msg = f.color + "," +
 * f.radius + "," + "켜져있음"; }
 */

/*
 * static String showFanInfo(boolean on) { if (on) { return "동작중"; } else {
 * return "꺼져있음"; } }
 */

// 예제 3번
class AccountVO {
	int aid;
	int balance;
	float interestRate;
	String dateCreated;
	int a;

	public AccountVO() {
		aid = 0;
		balance = 0;
		interestRate = 0;
		dateCreated = "2013-11-07";

	}

	public AccountVO(int aid, int balance, float interestRate,
			String dateCreated) {
		this.aid = aid;
		this.balance = balance;
		this.interestRate = interestRate;
		this.dateCreated = dateCreated;

	}

}

class AccountService {
	static float getmonthlyinterestRate(float interestRate) {
		return interestRate / 12;
	}

	static int withDraw(int balance, int a) {
		Scanner sc = new Scanner(System.in);
		System.out.println("인출할 금액을 넣어주세요");
		a = sc.nextInt();
		return balance - a;

	}

	static int deposit(AccountVO av, int a) {
		Scanner sc = new Scanner(System.in);
		System.out.println("인출할 금액을 넣어주세요");
		a = sc.nextInt();
		av.balance += a;
		System.out.println("입금 후 금액 : " + av.balance);
		return av.balance;

	}
	/*
	 * static int deposit(int balance,int a){ Scanner sc = new
	 * Scanner(System.in); System.out.println("예금액을 넣어주세요"); a = sc.nextInt();
	 * 
	 * } /
	 */

}
